package com.gitee.cirnochat.chatai.model.vo.req.aimsg;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.gitee.cirnochat.chatai.model.dto.markdown.ImageCountResult;
import com.gitee.cirnochat.chatai.model.enums.aimodel.AIModelType;
import com.gitee.cirnochat.common.utils.MarkdownUtil;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;

import java.util.List;

@Data
@Schema(description = "ai文本聊天DTO")
public class AiChatMessageDTO {
    @Schema(description = "会话ID，当会话ID为空时则表示你会选择创建一个新的会话")
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Long sessionId;

    @Schema(description = "消息内容")
    @NotBlank(message = "消息内容不能为空")
    private String content;

    /**
     * 校验消息内容的合法性
     * 可以根据实际需求添加更多的校验逻辑
     */
    @AssertTrue(message = "消息内容长度不能超过2000字符")
    @JsonIgnore
    public boolean isContentValid() {
        return content == null || content.length() <= 2000;
    }

    /**
     * 校验消息内容是否包含媒体文件
     * 这里假设MarkdownUtil.countImages方法返回的ImageCountResult中有一个getMediaCount方法
     * 用于获取媒体文件的数量
     */
    @AssertTrue(message = "消息内容格式有误，不能包含媒体文件")
    @JsonIgnore
    public boolean isContentFormatValid() {
        ImageCountResult imageCountResult = MarkdownUtil.countImages(content);
        return imageCountResult.getMediaCount() == 0;
    }

    /** 校验上传的图片数量是否超过限制
     * 用于获取图片的数量
     */
    @AssertTrue(message = "上传图片数量超出限制，不能超过5张")
    @JsonIgnore
    public boolean isContentImageExceed() {
        ImageCountResult imageCountResult = MarkdownUtil.countImages(content);
        return imageCountResult.getImageCount() <= 5;
    }

    @Schema(description = "模型")
    @NotBlank(message = "模型不能为空")
    private String model;

    @AssertTrue(message = "不可用的模型")
    @JsonIgnore
    public boolean isModelValid() {
        return AIModelType.fromValue(model) != null;
    }

    @Schema(description = "是否开启联网搜索")
    private Boolean searchNetwork = false;
}
